home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1993…ch: Other People's Memory / ADC Developer CD (1993-03) (''Other People's Memory'')_iso / Dev.CD Mar 93.iso / Technical Documentation / Sample Code / DTS.Lib & Samples / Kibitz / Config.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-22  |  10.9 KB  |  440 lines  |  [TEXT/MPS ]

  1. /*
  2. ** Apple Macintosh Developer Technical Support
  3. **
  4. ** File:        config.c
  5. ** Written by:  Eric Soldan
  6. **
  7. ** Copyright © 1990-1992 Apple Computer, Inc.
  8. ** All rights reserved. */
  9.  
  10.  
  11.  
  12. /*****************************************************************************/
  13.  
  14.  
  15.  
  16. #include "Kibitz.h"                /* Get the Kibitz includes/typedefs, etc.    */
  17. #include "KibitzCommon.h"        /* Get the stuff in common with rez.        */
  18. #include "Kibitz.protos"        /* Get the prototypes for Kibitz.            */
  19.  
  20. #ifndef __PACKAGES__
  21. #include <Packages.h>
  22. #endif
  23.  
  24. #ifndef __RESOURCES__
  25. #include <Resources.h>
  26. #endif
  27.  
  28. #ifndef __TOOLUTILS__
  29. #include <ToolUtils.h>
  30. #endif
  31.  
  32. #ifndef __UTILITIES__
  33. #include <Utilities.h>
  34. #endif
  35.  
  36.  
  37.  
  38. /*****************************************************************************/
  39.  
  40.  
  41.  
  42. #define kConfigOK        1
  43. #define kConfigEquivs    2
  44. #define kConfigCancel    3
  45. #define kPlayWhite        4
  46. #define kPlayBlack        5
  47. #define kCompWhite        6
  48. #define kCompBlack        7
  49. #define kTimerToggle    8
  50. #define kDivider1        9
  51. #define kDivider2        10
  52. #define kDivider3        11
  53. #define kWhiteClock        12
  54. #define kBlackClock        13
  55. #define kStatText1        14
  56. #define kStatText2        15
  57. #define kStatText3        16
  58. #define kStatText4        17
  59. #define kStatText5        18
  60.  
  61. static short    gOption;
  62.  
  63. static pascal Boolean    configFilter(DialogPtr dlg, EventRecord *event, short *item);
  64.  
  65.  
  66.  
  67. /*****************************************************************************/
  68.  
  69.  
  70.  
  71. static TheDoc    newConfig;
  72. static short    iconNum[3] = {rConfigBase, rConfigBase + 1, rConfigBase + 2};
  73.  
  74. pascal void        DoConfigureGameProc(DialogPtr dialog, short userItem);
  75.  
  76.  
  77.  
  78. /*****************************************************************************/
  79. /*****************************************************************************/
  80.  
  81.  
  82.  
  83. #pragma segment Config
  84. void    DoConfigureGame(FileRecHndl frHndl)
  85. {
  86.     WindowPtr        oldPort, window;
  87.     DialogPtr        dialog;
  88.     short            item, userItemType, i, val, part, option;
  89.     Handle            itemHndl;
  90.     Rect            userItemRect;
  91.     Str255            zone, machine, userName, timeStamp;
  92.     Point            mouseLoc;
  93.     unsigned long    tick, timeInSecs;
  94.     long            defaultTime, defaultMinutes;
  95.     Boolean            colorChange, timeChange;
  96.     TheDocPtr        docPtr;
  97.  
  98.     oldPort = SetFilePort(frHndl);
  99.  
  100.     newConfig = (*frHndl)->doc;
  101.         /* So DoConfigureGameProc can know, too.  This also allows us to cancel,
  102.         ** without changes. */
  103.  
  104.     zone[0] = machine[0] = userName[0] = timeStamp[0] = 0;
  105.     colorChange = timeChange = 0;
  106.  
  107.     window = (*frHndl)->fileState.window;
  108.     if (dialog = GetCenteredDialog(rConfigureGame, nil, window, (WindowPtr)-1L)) {
  109.         for (item = kPlayWhite; item <= kStatText5; ++item) {
  110.             GetDItem(dialog, item, &userItemType, &itemHndl, &userItemRect);
  111.             val = 0;
  112.             switch (item) {
  113.                 case kPlayWhite:
  114.                 case kPlayBlack:
  115.                     if ((newConfig.myColor) == item - kPlayWhite) ++val;
  116.                     break;
  117.                 case kCompWhite:
  118.                     if (newConfig.compMovesWhite) ++val;
  119.                     break;
  120.                 case kCompBlack:
  121.                     if (newConfig.compMovesBlack) ++val;
  122.                     break;
  123.                 case kTimerToggle:
  124.                     if (newConfig.timeLeft[0] != -1) ++val;
  125.                     break;
  126.                 case kDivider1:
  127.                 case kDivider2:
  128.                 case kDivider3:
  129.                 case kWhiteClock:
  130.                 case kBlackClock:
  131.                     itemHndl = (Handle)DoConfigureGameProc;
  132.                     SetDItem(dialog, item, userItemType, itemHndl, &userItemRect);
  133.                     break;
  134.                 case kStatText3:
  135.                     pcpy(userName, &newConfig.opponentName[0]);
  136.                     pcpy(zone, &newConfig.opponentZone[0]);
  137.                     pcpy(machine, &newConfig.opponentMachine[0]);
  138.                     if (timeInSecs = newConfig.timeLastReceive)
  139.                         IUTimeString(timeInSecs, false, timeStamp);
  140.                     break;
  141.             }
  142.  
  143.             if (val) SetCtlValue((ControlHandle)itemHndl, val);
  144.         }
  145.  
  146.         ParamText(zone, machine, userName, timeStamp);
  147.         OutlineDialogItem(dialog, kConfigOK);
  148.  
  149.         for (option = 0;;) {
  150.  
  151.             SetPort(dialog);
  152.             ModalDialog((ModalFilterProcPtr)configFilter, &item);
  153.  
  154.             if (item == kConfigOK) {
  155.  
  156.                 docPtr = &((*frHndl)->doc);
  157.                 docPtr->compMovesWhite = newConfig.compMovesWhite;
  158.                 docPtr->compMovesBlack = newConfig.compMovesBlack;
  159.                     /* This is between us and us. */
  160.  
  161.                 if (timeChange) {
  162.                     for (i = 0; i < 2; ++i) {
  163.                         if (option) {
  164.                             if (newConfig.timeLeft[i] == -1)
  165.                                 docPtr->freezeTime[i] = docPtr->timeLeft[i];
  166.                             else
  167.                                 newConfig.timeLeft[i] = docPtr->freezeTime[i];
  168.                         }
  169.                         else docPtr->freezeTime[i] = -1;
  170.                         docPtr->displayTime[i] = newConfig.defaultTime[i];
  171.                         docPtr->defaultTime[i] = newConfig.defaultTime[i];
  172.                         docPtr->timeLeft[i]    = newConfig.timeLeft[i];
  173.                     }
  174.                     (*frHndl)->doc.timerRefTick = TickCount();
  175.                     UpdateGameStatus(frHndl);
  176.                     SendMssg(frHndl, kTimeMssg);
  177.                     DrawTime(frHndl);
  178.                 }
  179.  
  180.                 if (colorChange)
  181.                     SendMssg(frHndl, newConfig.myColor);
  182.  
  183.                 break;
  184.             }
  185.  
  186.             if (item == kConfigCancel) break;
  187.  
  188.             GetDItem(dialog, item, &userItemType, &itemHndl, &userItemRect);
  189.             switch (item) {
  190.                 case kPlayWhite:
  191.                 case kPlayBlack:
  192.                     if (!GetCtlValue((ControlHandle)itemHndl)) {
  193.                         colorChange = true;
  194.                         SetCtlValue((ControlHandle)itemHndl, true);
  195.                         GetDItem(dialog, (kPlayWhite + kPlayBlack) - item,
  196.                                  &userItemType, &itemHndl, &userItemRect);
  197.                         SetCtlValue((ControlHandle)itemHndl, false);
  198.                         newConfig.myColor ^= 1;
  199.                     }
  200.                     break;
  201.                 case kCompWhite:
  202.                 case kCompBlack:
  203.                     val = (GetCtlValue((ControlHandle)itemHndl) ^ 1);
  204.                     SetCtlValue((ControlHandle)itemHndl, val);
  205.                     if (item == kCompWhite)
  206.                         newConfig.compMovesWhite = val;
  207.                     else
  208.                         newConfig.compMovesBlack = val;
  209.                     break;
  210.                 case kTimerToggle:
  211.                     option = gOption;
  212.                     timeChange = true;
  213.                     val = (GetCtlValue((ControlHandle)itemHndl) ^ 1);
  214.                     SetCtlValue((ControlHandle)itemHndl, val);
  215.                     if (val) {
  216.                         for (i = 0; i < 2; ++i)
  217.                             newConfig.timeLeft[i] = newConfig.displayTime[i] =
  218.                                 newConfig.defaultTime[i];
  219.                     }
  220.                     else {
  221.                         for (i = 0; i < 2; ++i)
  222.                             newConfig.timeLeft[i] = -1;
  223.                     }                        
  224.                     for (item = kWhiteClock; item <= kBlackClock; ++item)
  225.                         DoConfigureGameProc(dialog, item);
  226.                     break;
  227.                 case kWhiteClock:
  228.                 case kBlackClock:
  229.                     if (newConfig.timeLeft[0] == -1) break;
  230.  
  231.                     userItemRect.right  -= 2;
  232.                     userItemRect.bottom -= 2;
  233.                         /* Don't include the drop shadow in hit area. */
  234.  
  235.                     part = 0;
  236.                     tick = TickCount();
  237.  
  238.                     GetMouse(&mouseLoc);
  239.                     if (PtInRect(mouseLoc, &userItemRect)) {
  240.                         if (mouseLoc.h < userItemRect.left + 16) {
  241.                             userItemRect.right = userItemRect.left + 16;
  242.                             part = 1;
  243.                         }
  244.                         else {
  245.                             if (mouseLoc.h > userItemRect.right - 16) {
  246.                                 userItemRect.left = userItemRect.right - 16;
  247.                                 part = 3;
  248.                             }
  249.                         }
  250.                         if (part) {
  251.                             if (mouseLoc.v > userItemRect.top + 12) {
  252.                                 ++part;
  253.                                 userItemRect.top += 12;
  254.                             }
  255.                             else
  256.                                 userItemRect.bottom = userItemRect.top + 12;
  257.                         }
  258.                     }
  259.                     if (!PtInRect(mouseLoc, &userItemRect)) part = 0;
  260.                         /* After calculating which rect we are supposed to be in,
  261.                         ** make sure we are actually in it.  (We might not be.) */
  262.  
  263.                     do {
  264.                         GetMouse(&mouseLoc);
  265.                         if (PtInRect(mouseLoc, &userItemRect)) {
  266.                             if (part) {
  267.                                 timeChange = true;
  268.                                 defaultTime = newConfig.defaultTime[item - kWhiteClock];
  269.                                 if (part >= 3) {
  270.                                     defaultMinutes = defaultTime;
  271.                                     defaultTime /= 216000L;
  272.                                     defaultTime *= 216000L;
  273.                                     defaultMinutes -= defaultTime;
  274.                                 }
  275.                             }
  276.                             switch (part) {
  277.                                 case 1:
  278.                                     iconNum[0] = rConfigBase + 3;
  279.                                     defaultTime += 216000L;
  280.                                     if (defaultTime >= (216000L * 4))
  281.                                         defaultTime -= (216000L * 4);
  282.                                     if (!defaultTime)
  283.                                         defaultTime = 216000L;
  284.                                     break;
  285.                                 case 2:
  286.                                     iconNum[0] = rConfigBase + 4;
  287.                                     defaultTime -= 216000L;
  288.                                     if (defaultTime < 0)
  289.                                         defaultTime += (216000L * 4);
  290.                                     if (!defaultTime)
  291.                                         defaultTime = (216000L * 3);
  292.                                     break;
  293.                                 case 3:
  294.                                     iconNum[2] = rConfigBase + 5;
  295.                                     defaultMinutes += 3600;
  296.                                     if (defaultMinutes >= 216000L)
  297.                                         defaultMinutes -= 216000L;
  298.                                     defaultTime += defaultMinutes;
  299.                                     if (!defaultTime)
  300.                                         defaultTime = 3600;
  301.                                     break;
  302.                                 case 4:
  303.                                     iconNum[2] = rConfigBase + 6;
  304.                                     defaultMinutes -= 3600;
  305.                                     if (defaultMinutes < 0)
  306.                                         defaultMinutes += 216000L;
  307.                                     defaultTime += defaultMinutes;
  308.                                     if (!defaultTime)
  309.                                         defaultTime = (216000L - 3600);
  310.                                     break;
  311.                             }
  312.                         }
  313.                         if (part) {
  314.                             newConfig.defaultTime[item - kWhiteClock] = defaultTime;
  315.                             for (i = 0; i < 2; ++i)
  316.                                 newConfig.timeLeft[i] = newConfig.displayTime[i] =
  317.                                     newConfig.defaultTime[i];
  318.                             DoConfigureGameProc(dialog, item);
  319.                             iconNum[0] = rConfigBase;
  320.                             iconNum[2] = rConfigBase + 2;
  321.                         }
  322.  
  323.                         while ((StillDown()) && (tick + 30 > TickCount()));
  324.                         tick += 3;
  325.  
  326.                     } while (StillDown());
  327.  
  328.                     DoConfigureGameProc(dialog, item);
  329.                     break;
  330.             }
  331.         }
  332.         DisposDialog(dialog);
  333.     }
  334.  
  335.     SetPort(oldPort);
  336. }
  337.  
  338.  
  339.  
  340. /*****************************************************************************/
  341.  
  342.  
  343.  
  344. #pragma segment Config
  345. pascal void    DoConfigureGameProc(DialogPtr dialog, short userItem)
  346. {
  347.     short            userItemType;
  348.     Handle            userProc;
  349.     Rect            userItemRect;
  350.     Rect            clockRect;
  351.     short            i, time[3];
  352.     unsigned long    defaultTime;
  353.     Handle            clockPart;
  354.     RgnHandle        oldClip, newClip, textClip;
  355.     Str32            pstr;
  356.     Boolean            timed;
  357.  
  358.     GetDItem(dialog, userItem, &userItemType, &userProc, &userItemRect);
  359.     if (userItem < kWhiteClock) {
  360.         PenPat((ConstPatternParam)&qd.gray);
  361.         FrameRect(&userItemRect);
  362.         PenNormal();
  363.     }
  364.     else {
  365.         timed = (newConfig.timeLeft[0] != -1);
  366.  
  367.         oldClip = NewRgn();
  368.         GetClip(oldClip);
  369.         newClip = NewRgn();
  370.         RectRgn(newClip, &userItemRect);
  371.         SetRectRgn(textClip = NewRgn(),
  372.             userItemRect.left   + 16,
  373.             userItemRect.top    + 2,
  374.             userItemRect.right  - 19,
  375.             userItemRect.bottom - 4);
  376.         if (timed) DiffRgn(newClip, textClip, newClip);
  377.         SetClip(newClip);
  378.  
  379.         clockRect = userItemRect;
  380.         clockRect.right  = clockRect.left + 32;
  381.         clockRect.bottom = clockRect.top  + 32;
  382.         for (i = 0; i < 3; ++i) {
  383.             if (clockPart = GetResource('ICN#', iconNum[i]))
  384.                 PlotIcon(&clockRect, clockPart);
  385.             OffsetRect(&clockRect, 24, 0);
  386.         }
  387.  
  388.         if (timed) {
  389.             SetClip(textClip);
  390.             TextMode(srcCopy);
  391.             defaultTime = newConfig.defaultTime[userItem - kWhiteClock];
  392.             for (i = 3; i;) {
  393.                 defaultTime /= 60;
  394.                 time[--i] = defaultTime % 60;
  395.             }
  396.             for (i = 0; i < 2; ++i) {
  397.                 MoveTo(userItemRect.left + 21 + 20 * i, userItemRect.top + 15);
  398.                 pcpydec(pstr, time[i]);
  399.                 if (pstr[0] == 1) DrawChar('0');
  400.                 DrawString(pstr);
  401.                 DrawChar(": "[i]);
  402.             }
  403.             TextMode(srcOr);
  404.         }
  405.  
  406.         SetClip(oldClip);
  407.         DisposeRgn(oldClip);
  408.         DisposeRgn(newClip);
  409.         DisposeRgn(textClip);
  410.     }
  411. }
  412.  
  413.  
  414.  
  415. /*****************************************************************************/
  416.  
  417.  
  418.  
  419. #pragma segment Config
  420. pascal Boolean    configFilter(DialogPtr dlg, EventRecord *event, short *item)
  421. {
  422.     static unsigned long    lastIdle;
  423.  
  424.     gOption = (event->modifiers) & optionKey;
  425.  
  426.     if (KeyEquivFilter(dlg, event, item))
  427.         return(true);
  428.  
  429.     if (lastIdle + 30 < TickCount()) {
  430.         lastIdle = TickCount();
  431.         DoIdleTasks(false);
  432.         SetPort(dlg);
  433.     }
  434.  
  435.     return(false);
  436. }
  437.  
  438.  
  439.  
  440.